66. 对其他构建系统的支持

如果想使用除了Maven和Gradle之外的构建工具,你可能需要开发自己的插件。可执行jars需要遵循一个特定格式,并且一些实体需要以不压缩的方式写入(详情查看附录中的可执行jar格式章节)。

Spring Boot Maven和Gradle插件在实际生成jars的过程中会使用spring-boot-loader-tools,如果需要,你也可以自由地使用该library。

66.1. 重新打包存档

使用org.springframework.boot.loader.tools.Repackager可以将一个存在的存档重新打包,这样它就变成一个自包含的可执行存档。Repackager类需要提供单一的构造器参数,该参数指向一个存在的jar或war包。你可以使用两个可用的repackage()方法中的一个来替换原始的文件或写入新的目标,在repackager运行前还可以指定各种配置。

66.2. 内嵌库

当重新打包一个存档时,你可以使用org.springframework.boot.loader.tools.Libraries接口来包含对依赖文件的引用。在这里我们不提供任何该Libraries接口的具体实现,因为它们通常跟具体的构建系统相关。

如果存档已经包含libraries,你可以使用Libraries.NONE

66.3. 查找main类

如果你没有使用Repackager.setMainClass()指定一个main类,该repackager将使用ASM去读取class文件,然后尝试查找一个合适的,具有public static void main(String[] args)方法的类。如果发现多个候选者,将会抛出异常。

66.4. repackage实现示例

这是一个典型的repackage示例:

Repackager repackager = new Repackager(sourceJarFile);
repackager.setBackupSource(false);
repackager.repackage(new Libraries() {
            @Override
            public void doWithLibraries(LibraryCallback callback) throws IOException {
                // Build system specific implementation, callback for each dependency
                // callback.library(new Library(nestedFile, LibraryScope.COMPILE));
            }
        });